﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AlgoritimoGenetico
{
    public class Cromossomo
    {
        #region Construtor
        public Cromossomo()
        {
            this.Genes = new List<Gene>();
        }

        public Cromossomo(List<Gene> genes)
        {
            this.Genes = genes;
        }
        #endregion

        #region Propriedades
        public List<Gene> Genes { get; set; }
        public float Fitness { get; set; }
        public float AvalDist { get; set; }
        #endregion

        #region Métodos
        public Gene GetGene(int posicao)
        {
            return this.Genes.ElementAt(posicao);
        }
        public void SetGene(int posicao, Gene gene)
        {
            if(this.Genes != null && this.Genes.Count <= posicao)
                this.Genes.Insert(posicao, gene);
        }
        public override string ToString()
        {
            string genes = string.Empty;
            foreach (Gene gene in Genes)
            {
               genes = string.Concat (genes, gene.ToString(), "\n");
            }
            genes = string.Concat(genes, "\nFitness: " + this.Fitness, "\nTamanho Rota: " + this.Genes.Count, "\nComprimento Rota(NORMALIZADO): ", this.AvalDist);
            return genes;
        }
        public string getRota()
        {
            string rota = string.Empty;
            foreach (Gene gene in this.Genes)
            {
                rota += gene.Nome + ", ";
            }
            return rota;
        }

        public List<string> getNomeCidades()
        {
            List<string> cidades = new List<string>();
            foreach (Gene gene in this.Genes)
            {
                cidades.Add(gene.Nome);
            }
            return cidades;
        }
        public bool Equals(Cromossomo obj)
        {
            List<string> cidades1 = obj.getNomeCidades();
            List<string> cidades2 = this.getNomeCidades();

            cidades1.Sort();
            cidades2.Sort();

            for (int i = 0; i < cidades2.Count; i++)
            {
                if (!string.Equals(cidades1[i], cidades2[i]))
                    return false;
            }
            return true;
        }
        public Cromossomo Clone()
        {
            Cromossomo clone = new Cromossomo();
            clone.Fitness = this.Fitness;
            clone.AvalDist = this.AvalDist;
            clone.Genes = this.CloneGenes();

            return clone;
        }
        public List<Gene> CloneGenes()
        {
            List<Gene> clone = new List<Gene>(this.Genes.Count);
            foreach (Gene gene in this.Genes)
                clone.Add(gene.Clone());

            return clone;
        }
        #endregion
    }
}
